<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>装饰器模式</title>
</head>

<body>
    <script>
        // slow函数执行花费时间较长,因此我们希望该函数可以缓存结果,当再次以相同的条件调用时直接返回缓存的结果
        function slow (a) {
            return a
        }

        function decorator (func) {
            let map = new Map()
            return function (a) {
                if (!map.has(a)) {
                    console.log('没有缓存')
                    map.set(a, func(a))
                } else {
                    console.log('有缓存')
                }
                return map.get(a)
            }
        }

        slow = decorator(slow)

        console.log(slow('2222')) // 第一次没有缓存
        console.log(slow('2222')) // 第二次从缓存中读取


        // 这种做法的好处是:
        // 1. decorator是可重用的,可以将它应用于任何函数.
        // 2. 缓存逻辑是独立的,它没有增加slow函数本身的复杂性.
        // 3. 如果需要,我们可以组合多个装饰器

    </script>
</body>

</html>